磁盘连接的属性
系统调用 open 用于在进程和磁盘文件之间创建一个连接. 该链接含有若干个属性, 下面 先仔细学习其中两个属性
属性1: 缓冲
可以通过修改控制变量改变文件描述符的动作, 列入通过3不操作关闭磁盘缓冲
#include <fcntl.h> int s; // settings s = fcntl(fd, F_GETFL); // get flags s |= O_SYNC; // set SYNC bit result = fcntl(fd, S_SETFL, s); // set flags if(result == -1) // if error perror("setting SYNC"); // report
文件描述符属性被编码在一个整数的位中. 系统调用 fcntl 通过读写该证书位来控制文件 描述符.
fcntl | |
---|---|
目标 | 控制文件描述符 |
头文件 | #include <fcntl.h>/#include <unistd.h>/#include <sys/types.h> |
原型 | int result = fcntl(ind fd, int cmd); |
int result = fcntl(int fd, int cmd, long arg); | |
int result = fcntl(int fd, int cmd, struct flock * lockp); | |
参数 | fd 文件描述符/cmd 操作 /arg 操作的参数/ lock 锁信息 |
返回值 | -1 遇到错误 other 依操作而定 |
设置 O_SYNC 会关闭内核的缓冲机制, 如果没有很充分的理由, 最好不要关闭缓冲.
属性2: 自动添加模式
文件描述符的另一个属性是自动添加模式(auto-append mode).自动添加模式对于若干个 进程在同一时间写入文件是很有用的.
当文件描述符 o_APPEND 位开启后, 每个对 write 的调用自动调用 lseek 将内容添加到 文件的末尾.
下面代码启动自动添加模式, 然后调用 write:
#include <fcntl.h> int s; s = fcntl(fd, F_GETFL); s |= O_APPEND; result = fcntl(fd, F_SETFL, s); if (result == -1) perror("setting APPEND"); else write(fd, &rec, 1);
当 O_APPEND 被置位, 内核将 lseek 和 write 组合成一个原子操作, 被连接成一个不可 分割的单元.
用 open 控制文件描述符
可以通过系统调用 open 的第二个参数的一部分来设置文件描述符的属性位.
fd = open(WTMP_FILE, O_WRONLY | O_APPEND | O_SYNC);
可以通过 open 闯将一个包含 O_CREAT 标志位的文件, 以下两个调用是等价的:
fd = creat(filename, permission_bits); fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY, permission_bits);
open 支持的其他标志位:
- O_CREAT 如果不存在, 创建该文件, 可以查看 O_EXCL.
- O_TRUNC 如果文件存在, 就爱那个文件长度置为 0.
- O_EXCL O_EXCL 标志位防止两个进程创建同样的文件, 如果文件存在且 O_EXCL被置位, 则返回 -1.